/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.cip.esymons.eventos.bc.ConsejoDepartamentalDelegate;
import org.cip.esymons.eventos.bc.EventoDelegate;
import org.cip.esymons.eventos.bc.FormatoCertificadoDelegate;
import org.cip.esymons.eventos.bc.InstructorEventoDelegate;
import org.cip.esymons.eventos.bc.ModuloCursoDelegate;
import org.cip.esymons.eventos.bc.PreEventoDelegate;
import org.cip.esymons.eventos.be.Evento;
import org.cip.esymons.eventos.be.FormatoCertificado;
import org.cip.esymons.eventos.be.ModuloCurso;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.general.be.ConsejoDepartamental;
import org.cip.esymons.general.be.Directivos;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author Lizardo Rios
 */
public class FormatoCertificadoController {

    private FormatoCertificadoDelegate delegado;
    private PreEventoDelegate delegadoPreevento;
    private EventoDelegate delegadoEvento;
    private ConsejoDepartamentalDelegate delegadoConsejoDepartamental;
    private InstructorEventoDelegate delegadoInstructor;
    private FormatoCertificado formatoCertificado;
    private PersonaNatural persona;
    private ConsejoDepartamental consejo;
    private Evento evento;
    List<FormatoCertificado> listaFormatoCertificado;
    List<FormatoCertificado> listaFormatoCertificadoV2;
    private Integer codigoEvento;
    private Integer codigoModulo;
    private Integer codigoConsejo;
    private String nombreDecano;
    private String nombreInstructor;
    private String total;
    private Boolean fraseModulo;
    private String nombreArea;
    
    /***************************  Constructor *******************************/
    public FormatoCertificadoController() {
        inicializar();
    }

    /*************************** Setters and Getters  ***********************/
    public String getTotal() {
        return total;
    }
    public void setTotal(String total) {
        this.total = total;
    }
    
    public FormatoCertificado getFormatoCertificado() {
        return formatoCertificado;
    }
    public void setFormatoCertificado(FormatoCertificado formatoCertificado) {
        this.formatoCertificado = formatoCertificado;
    }

    public FormatoCertificadoDelegate getDelegado() {
        return delegado;
    }

    public List<FormatoCertificado> getListaFormatoCertificado() {
        return listaFormatoCertificado;
    }
    public void setListaFormatoCertificado(List<FormatoCertificado> listaFormatoCertificado) {
        listar();
        this.listaFormatoCertificado = listaFormatoCertificado;
    }

    public List<FormatoCertificado> getListaFormatoCertificadoV2() {
        listarV2();
        return listaFormatoCertificadoV2;
    }

    public void setListaFormatoCertificadoV2(List<FormatoCertificado> listaFormatoCertificadoV2) {
        this.listaFormatoCertificadoV2 = listaFormatoCertificadoV2;
    }



    public Integer getCodigoModulo() {
        return codigoModulo;
    }

    public void setCodigoModulo(Integer codigoModulo) {
        this.codigoModulo = codigoModulo;
    }

    public String getNombreArea() {
        return nombreArea;
    }

    public void setNombreArea(String nombreArea) {
        this.nombreArea = nombreArea;
    }



    public Boolean getFraseModulo() {
        return fraseModulo;
    }

    public void setFraseModulo(Boolean fraseModulo) {
        this.fraseModulo = fraseModulo;
    }

    public EventoDelegate getDelegadoEvento() {
        return delegadoEvento;
    }
    public void setDelegadoEvento(EventoDelegate delegadoEvento) {
        this.delegadoEvento = delegadoEvento;
    }

    public Integer getCodigoEvento() {
        mostrarInstructor();
        return codigoEvento;
    }
    public void setCodigoEvento(Integer codigoPreevento) {
        this.codigoEvento = codigoPreevento;
    }

    public String getNombreInstructor() {
        return nombreInstructor;
    }
    public void setNombreInstructor(String nombreInstructor) {
        this.nombreInstructor = nombreInstructor;
    }

    public String getNombreDecano() {
        buscarDecano();
        return "Ing." +nombreDecano;
    }

    public void setNombreDecano(String nombreDecano) {
        this.nombreDecano = nombreDecano;
    }

    public InstructorEventoDelegate getDelegadoInstructor() {
        return delegadoInstructor;
    }
    public void setDelegadoInstructor(InstructorEventoDelegate delegadoInstructor) {
        this.delegadoInstructor = delegadoInstructor;
    }

    public PersonaNatural getPersona() {
        return persona;
    }
    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public Integer getCodigoConsejo() {
        return codigoConsejo;
    }
    public void setCodigoConsejo(Integer codigoConsejo) {
        this.codigoConsejo = codigoConsejo;
    }

    public ConsejoDepartamental getConsejo() {
        return consejo;
    }
    public void setConsejo(ConsejoDepartamental consejo) {
        this.consejo = consejo;
    }

    public Evento getEvento() {
        return evento;
    }
    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    public PreEventoDelegate getDelegadoPreevento() {
        return delegadoPreevento;
    }
    public void setDelegadoPreevento(PreEventoDelegate delegadoPreevento) {
        this.delegadoPreevento = delegadoPreevento;
    }

    public ConsejoDepartamentalDelegate getDelegadoConsejoDepartamental() {
        return delegadoConsejoDepartamental;
    }
    public void setDelegadoConsejoDepartamental(ConsejoDepartamentalDelegate delegadoConsejoDepartamental) {
        this.delegadoConsejoDepartamental = delegadoConsejoDepartamental;
    }

    /**********************************  Metodos  *****************************/
    public void inicializar() {
        formatoCertificado = new FormatoCertificado();
        persona = new PersonaNatural();
        consejo = new ConsejoDepartamental();
        evento = new Evento();
        delegado = new FormatoCertificadoDelegate();
        delegadoConsejoDepartamental = new ConsejoDepartamentalDelegate();
        delegadoEvento = new EventoDelegate();
        delegadoPreevento = new PreEventoDelegate();
        delegadoInstructor = new InstructorEventoDelegate();
        listaFormatoCertificado = new ArrayList<FormatoCertificado>();
        listaFormatoCertificadoV2 = new ArrayList<FormatoCertificado>();
        fraseModulo = true;
        codigoEvento = 0;
        codigoConsejo = 0;
        listar();
        listarV2();
    }

    public String insertar() {
        try {
            formatoCertificado.setForTipo(1); //Diplomados
            formatoCertificado.setForDecano(nombreDecano);
            formatoCertificado.setForfechaCreacion(new Date());
            formatoCertificado.setForActivo(true);
            consejo = delegadoConsejoDepartamental.find(codigoConsejo);
            evento = delegadoEvento.find(codigoEvento);
            formatoCertificado.setCdeCodigo(consejo);
            formatoCertificado.setEveCodigo(evento);
            formatoCertificado.setForFrase04(evento.getPreevento().getPreNombre());
            delegado.create(formatoCertificado);
            consejo = null;
            evento = null;
            return listar();
        } catch (Exception e) {
            mostrarMensaje("Error: ", "Ingrese datos obligatorios!", FacesMessage.SEVERITY_ERROR);
            return null;
        }
    }

    public String insertarV2() {
        try {
            formatoCertificado.setForTipo(0); //Eventos
            formatoCertificado.setForDecano(nombreDecano);
            formatoCertificado.setForfechaCreacion(new Date());
            formatoCertificado.setForActivo(true);
            codigoConsejo = 2;  //la libertad propia de casa
            consejo = delegadoConsejoDepartamental.find(codigoConsejo);
            evento = delegadoEvento.find(codigoEvento);
            formatoCertificado.setCdeCodigo(consejo);
            formatoCertificado.setEveCodigo(evento);
            //formatoCertificado.setForFrase04(evento.getPreevento().getPreNombre());
            delegado.create(formatoCertificado);
            consejo = null;
            evento = null;
            return listarV2();
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", "Ingrese datos obligatorios!", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
            return null;
        }
    }

    public String ir_a_editar() {
        actualizarCombos();
        return "editar";
    }

    public String ir_a_editarV2() {
        actualizarCombosV2();
        return "editar2";
    }

    public void actualizarCombos() {
        try {
            if (formatoCertificado != null) {
                ModuloCursoDelegate delegadoModulo = new ModuloCursoDelegate();
                ModuloCurso modulo = new ModuloCurso();
                modulo = delegadoModulo.buscarXNombre(formatoCertificado.getForFrase03());
                codigoConsejo = (formatoCertificado.getCdeCodigo() != null) ? formatoCertificado.getCdeCodigo().getCdeCodigo() : 0;
                codigoEvento = (formatoCertificado.getEveCodigo() != null) ? formatoCertificado.getEveCodigo().getEveCodigo() : 0;
                codigoModulo = (modulo != null) ? modulo.getModCodigo() : 0;
                codigoModulo = (codigoModulo != null) ? codigoModulo : 0;
                delegadoModulo = null;
                modulo = null;
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En actualizar listas despegables de los formatos", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

    public void actualizarCombosV2() {
        try {
            codigoEvento = (formatoCertificado.getEveCodigo() != null) ? formatoCertificado.getEveCodigo().getEveCodigo() : 0;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En actualizar el evento", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

    public String escribirArea() {
        nombreArea = (formatoCertificado.getForFrase05() != null) ? formatoCertificado.getForFrase05() : "";
        return null;
    }

    public String actualizar() {
        try {
            delegado.edit(formatoCertificado);
            return listar();
        } catch (Exception e) {
            mostrarMensaje("Error: ", "Ingrese datos obligatorios!", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
            return null;
        }
    }

    public String actualizarV2() {
        try {
            delegado.edit(formatoCertificado);
            return listarV2();
        } catch (Exception e) {
            mostrarMensaje("Error: ", "Ingrese datos obligatorios!", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
            return null;
        }
    }

    public String eliminar() {
        try {
            formatoCertificado.setForActivo(false);
            delegado.edit(formatoCertificado);
            return listar();
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede eliminar este formato!", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
            return null;
        }
    }

    public String eliminarV2() {
        try {
            formatoCertificado.setForActivo(false);
            delegado.edit(formatoCertificado);
            return listarV2();
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede eliminar este formato!", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
            return null;
        }
    }

    public String cancelar() {
        formatoCertificado = new FormatoCertificado();
        return null;
    }

    public String actualizarConsejo() {
        try {
            System.out.print("Codigo Consejo: " + codigoConsejo);
            codigoConsejo = (codigoConsejo == null) ? 0 : codigoConsejo;
            ConsejoDepartamental cons = new ConsejoDepartamental();
            ConsejoDepartamentalDelegate delegadoConsejo = new ConsejoDepartamentalDelegate();
            cons = delegadoConsejo.find(codigoConsejo);
            if (formatoCertificado != null && cons != null) {
                formatoCertificado.setForFrase01(cons.getCdeDescripcion());
                formatoCertificado.setForFrase07(cons.getCdeDescripcion());
            } else {
                formatoCertificado.setForFrase01("<Seleccione un consejo departamental>");
                formatoCertificado.setForFrase07("<Seleccione un consejo departamental>");
            }
            cons = null;
            delegadoConsejo = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al actualizar consejo departamental...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return "";
    }

    public String actualizarEvento() {
        try {
            System.out.print("Codigo Evento: " + codigoEvento);
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            mostrarInstructor();
            Preevento pre = new Preevento();
            PreEventoDelegate delegadoPre = new PreEventoDelegate();
            pre = delegadoPre.findID(codigoEvento);
            formatoCertificado.setForFrase03("");
            if (formatoCertificado != null && pre != null) {
                formatoCertificado.setForFrase05(pre.getPreNombre());
            } else {
                formatoCertificado.setForFrase05("<Seleccione un evento>");
            }
            pre = null;
            delegadoPre = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al actualizar el evento...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return "";
    }

    public String actualizarModulo() {
        try {
            System.out.print("Codigo Modulo: " + codigoModulo);
            codigoModulo = (codigoModulo == null) ? 0 : codigoModulo;
            ModuloCurso mod = new ModuloCurso();
            ModuloCursoDelegate delegadoModuloCurso = new ModuloCursoDelegate();
            mod = delegadoModuloCurso.find(codigoModulo);
            if (formatoCertificado != null && mod != null) {
                formatoCertificado.setForFrase03(mod.getModNombre());
            } else {
                formatoCertificado.setForFrase03("<Seleccione un modulo>");
            }
            mod = null;
            delegadoModuloCurso = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al actualizar modulio curso...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return "";
    }

    public String listar() {
        try {
            listaFormatoCertificado = delegado.listarFormatoCertificadoCursos();
            total = Utiles.totalRegistro(listaFormatoCertificado, "certificado(s) existente(s)");
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En listar los certificados...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return "listar";
    }

    public String listarV2() {
        try {
            listaFormatoCertificadoV2 = delegado.listarFormatoCertificadoEventos();
            total = Utiles.totalRegistro(listaFormatoCertificadoV2, "certificado(s) existente(s)");
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En listar los certificados...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return "listar2";
    }

    public String mostrarInstructor() {
        codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
        System.out.println("codigoPreevento: " + codigoEvento);
        persona = delegadoInstructor.mostrarInstructor(codigoEvento);
        if (persona != null) {
            nombreInstructor = persona.getNombreCompleto();
            persona = null;
        } else {
            nombreInstructor = "< Sin Instructor >";
        }
        if (formatoCertificado != null) {
            formatoCertificado.setForDocente(nombreInstructor);
        } else {
            formatoCertificado.setForDocente("< Sin Instructor >");
        }
        return "";
    }

    public String nuevo() {
        inicializar();
        return "nuevo";
    }

    public String nuevoV2() {
        inicializar();
        return "nuevo2";
    }

    private void buscarDecano() {
        try {
            Directivos directivo = new Directivos();
            directivo = delegado.buscarDecano();
            if (directivo != null) {
                nombreDecano = directivo.getColCodigo().getPersonaNatural().getNombreCompleto();
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede mostrar el nombre del décano", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

    public SelectItem[] getComboFormatoCertificados() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //codigoEvento = 3; //borrar esta linea
            //System.out.println("codigoEvento: " + codigoEvento);
            List<FormatoCertificado> listaFormatos = delegado.findAll();
            selects = new SelectItem[listaFormatos.size()];
            int cont = 0;
            for (FormatoCertificado formato : listaFormatos) {
                SelectItem item = new SelectItem(formato.getForCodigo(), formato.getForNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen formatos certificados");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboEventos() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<Preevento> listaEventos = delegadoPreevento.findAll();
            selects = new SelectItem[listaEventos.size()];
            int cont = 0;

           boolean bandera = true;

            for (Preevento preevento : listaEventos) {
                if (bandera) {
                    preevento.setNroCaracteres(35);
                    bandera = false;
                }
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombreCorto());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen eventos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboModulos() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //codigoEvento = 3; //borrar esta linea
            System.out.println("codigoEvento: " + codigoEvento);
            ModuloCursoDelegate delegadoModuloCurso = new ModuloCursoDelegate();
            //List<ModuloCurso> listaModulos = delegadoModuloCurso.listarModuloXCurso(codigoEvento);
            List<ModuloCurso> listaModulos = delegadoModuloCurso.listarModulo(codigoEvento);
            delegadoModuloCurso = null;
            selects = new SelectItem[listaModulos.size()];
            int cont = 0;
            for (ModuloCurso modulos : listaModulos) {
                SelectItem item = new SelectItem(modulos.getModCodigo(), modulos.getModNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen modulos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboEventosSinCurso() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            delegadoPreevento = new PreEventoDelegate();
            List<Preevento> listaEvento = delegadoPreevento.listaEventosSinCurso();
            selects = new SelectItem[listaEvento.size()];
            int cont = 0;
            boolean ban = true;
            for (Preevento preevento : listaEvento) {
                if (ban) {
                    preevento.setNroCaracteres(35);
                    ban = false;
                }
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombreCorto());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen eventos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboEventosConCurso() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            delegadoPreevento = new PreEventoDelegate();
            List<Preevento> listaEvento = delegadoPreevento.listaEventosConCurso();
            selects = new SelectItem[listaEvento.size()];
            int cont = 0;
            boolean ban = true;
            for (Preevento preevento : listaEvento) {
                if (ban) {
                    preevento.setNroCaracteres(35);
                    ban = false;
                }
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombreCorto());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen eventos");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

   


}
